package com.example.graduation.aop;

import com.example.graduation.config.shiro.ThreadLocalToken;
import com.example.graduation.util.R;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * ProjectName graduation
 * 这个类是一个切面类，他的作用主要是为了解决令牌刷新时，切面类判断localToken里面是否有值，有的话实现令牌刷新机制
 *
 * @author xieyucan
 * <br>CreateDate 2022/2/14 15:24
 */
@Component
@Slf4j
@Aspect
public class TokenAspect {
    @Resource
    private ThreadLocalToken localToken;

    /**
     * 接入切面点，我的切入点是controller层里面的每一个方法
     *
     * @author xieyucan
     * CreateDate 2022/2/14 15:33
     */

    @Pointcut("execution(public * com.example.graduation.controller.*.*(..))")
    public void aspect() {

    }


    /**
     * 环绕切点，在这里，我每执行一个方法，我的环绕切点都会去判断一次
     *
     * @param point
     * @return {@link Object}
     * @author xieyucan
     * CreateDate 2022/2/14 15:34
     */
    @Around("aspect()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        R r = (R) point.proceed();
        String token = localToken.getToken();
        if (token != null) {
            log.info("令牌刷新");
            r.put("token", token);
            localToken.clean();
        }
        return r;
    }
}
